package 记事本;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import javax.swing.*;

public class Note extends JFrame implements ActionListener {

    //创建文本域
    JTextArea ta;
    // 创建文件对象，并设置保存文件的路径与名字
    File file = new File("D:/java笔记本.txt");
    Clipboard clipboard = getToolkit().getSystemClipboard();

    public Note() {
        // 设置窗体标题
        super("记事本");
        // 窗体初始大小及定位
        this.setBounds(300, 200, 600, 400);
        // 设置内容面板按边界布局
        this.getContentPane().setLayout(new BorderLayout());
        // 调用addMenuBar()添加窗体的菜单栏
        this.addMenuBar();
        // 调用addTextArea()添加文本区到内容面板
        this.addTextArea();
        //设置窗体关闭规则
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗体可见
        this.setVisible(true);
    }

    // 设置窗体菜单栏
    private void addMenuBar() {
        // 创建菜单栏
        JMenuBar mb = new JMenuBar();
        // 创建“文件”菜单
        JMenu f = new JMenu("文件");
        // 创建“编辑”菜单
        JMenu m = new JMenu("编辑");
        // 创建菜单项
        JMenuItem open = new JMenuItem("打开");
        JMenuItem build = new JMenuItem("新建");
        JMenuItem save = new JMenuItem("保存");
        JMenuItem exit = new JMenuItem("退出");
        JMenuItem copy = new JMenuItem("复制");
        JMenuItem cut = new JMenuItem("剪切");
        JMenuItem paste = new JMenuItem("粘贴");
        JMenuItem allSelect = new JMenuItem("全选");
        // 给各个菜单项注册单击事件侦听器
        open.addActionListener(this);
        build.addActionListener(this);
        save.addActionListener(this);
        exit.addActionListener(this);
        copy.addActionListener(this);
        cut.addActionListener(this);
        paste.addActionListener(this);
        allSelect.addActionListener(this);
        // 菜单项加到"文件"菜单
        f.add(open);
        f.add(build);
        f.add(save);
        f.add(exit);
        // 菜单项加到"编辑"菜单
        m.add(copy);
        m.add(cut);
        m.add(paste);
        m.add(allSelect);
        // 将"文件"菜单，"编辑"菜单加到菜单栏
        mb.add(f);
        mb.add(m);
        // 设置窗体的菜单栏
        this.setJMenuBar(mb);
    }

    //添加文本区
    private void addTextArea() {
        ta = new JTextArea();
        // 设置文本域自动换行
        ta.setLineWrap(true);
        // 给文本域设置背景颜色为白色
        ta.setBackground(Color.WHITE);
        // 将文本域添加到含有下拉框（条）的面板中
        JScrollPane sp = new JScrollPane(ta);
        // 设置下拉框的布局，添加到内容面板中
        this.getContentPane().add(sp, "Center");
        // 设置下拉框面板的下拉条，当行数超过页面显示上限会出现下拉条
        sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

    }

    //单击事件处理
    @Override
    public void actionPerformed(ActionEvent e) {
        // 判断是否点击了“文件”菜单
        if (e.getSource() instanceof JMenuItem) {
            // 处理打开文件事件
            if (e.getActionCommand() == "打开") {
                open();
            }// 处理保存文件事件
            else if (e.getActionCommand() == "保存") {
                save();
            }// 点击退出就退出程序
            else if (e.getActionCommand() == "退出") {
                exit();
            } else if (e.getActionCommand() == "新建") {
                build();
            }
        }
        // 判断是否点击了“编辑”菜单
        if (e.getSource() instanceof JMenuItem) {
            // 处理复制事件
            if (e.getActionCommand() == "复制") {
                ta.copy();
            }// 处理粘贴事件
            else if (e.getActionCommand() == "粘贴") {
                ta.paste();
            }// 处理全选事件
            else if (e.getActionCommand() == "全选") {
                ta.selectAll();
            }// 处理剪切事件
            else if (e.getActionCommand() == "剪切") {
                ta.cut();
            }
        }
    }

    // 新建文件方法
    public void build() {
        JFileChooser fc = new JFileChooser(); //创建一个JFileChooser对象
        if (fc.showSaveDialog(Note.this) == JFileChooser.APPROVE_OPTION) { //为文件对象添加名字
            // 获取选中的文件
            file = fc.getSelectedFile();
        } else {
            return;
        }
        // 获取输入的文件名
        fc.getName(file);
        if (file.exists()) {
            // 若选择已有文件，询问是否要覆盖
            int i = JOptionPane.showConfirmDialog(null,
                    "该文件已存在,是否覆盖原文件",
                    "确认", JOptionPane.YES_NO_OPTION);
            if (i == JOptionPane.YES_OPTION) {
                save();
            } else {
                fc.showSaveDialog(Note.this); // 重新选择
            }
        } else {
            save();//文件不存在，则直接保存
        }
    }


    // 打开文件方法
    public void open() {
        //创建一个JFileChooser对象
        JFileChooser fc = new JFileChooser();
        int result = fc.showOpenDialog(null);
        // 如果选择了FileChooser中的确定按钮，就执行以下操作
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile(); // 定义选中的文件夹的路径
            try {
                // 定义FileInputStream文件输入流对象，将文件数据读出来
                FileInputStream istr = new FileInputStream(file);
                BufferedReader br = new BufferedReader(new InputStreamReader(istr)); // 缓冲流提高读出速率
                String r = ""; //创建没有字符的字符串用于替换文本域中的内容
                while ((r = br.readLine()) != null) {
                    ta.append(r + "\n"); // 将读出的数据一行一行地写入文本域中
                }
                br.close(); // 关闭字符输入流
                istr.close(); // 关闭文件输入流
            } catch (FileNotFoundException e1) {// 异常处理
                System.out.println("文件不存在或并未选中!");
            } catch (IOException e1) {
                System.out.println("文件输入异常！");
            }
        }
    }

    //保存文件方法封装
    public void save() {
        try {
            //创建FileOutputStream对象，将数据写入文件
            FileOutputStream ostr = new FileOutputStream(file);
            //创建缓冲流BufferedWriter对象，提高写入速率
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ostr));
            //用.getText().split("\n")将文本域内容拆开，变成数组元素
            for (String text : ta.getText().split("\n")) {
                // 将文本域的内容写入文件中
                bw.write(text);
                // 换行
                bw.newLine();
            }
            bw.flush(); // 刷新字符输出流通道
            bw.close();// 关闭字符输出流
            ostr.close();// 关闭文件输出流
            JOptionPane.showMessageDialog(null, "保存成功"); //弹出窗口显示信息
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在或并未选中!");
        } catch (IOException e) {
            System.out.println("文件输出异常！");
        }
    }

    //退出记事本的方法
    public void exit() {
        int ex = 0;
        if (ex == JOptionPane.showConfirmDialog(this, "退出系统？")) {
            System.exit(0);
        }
    }

    //主方法中创建Note对象
    public static void main(String[] args) {
        new Note();
    }
}

